/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package application;

import application.beans.MessageInterneBean;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Étienne
 */
class MessageInterneDAO {
    /**
     * Procédure servant à écrire un message interne dans la base de données
     * @param message 
     */
    public void ecrireMessageInterne(MessageInterneBean message, 
            List<Integer> destinataires){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();  
        
        Date maintenant = new Date();
        Integer idMessage = 0;
   
        Query query = session.createSQLQuery("insert into MESSAGE_INTERNE(titre,"
                  + " message, id_envoyeur, date_envoi) values("
                  + ":titre, "
                  + ":message, "
                  + ":idEnvoyeur, "
                  + ":dateEnvoi)");

        query.setParameter("titre",message.getTitre());
        query.setParameter("message", message.getMessage());
        query.setParameter("idEnvoyeur", message.getEnvoyeur().getIdCompte());
        query.setParameter("dateEnvoi", maintenant);
        query.executeUpdate();
        session.getTransaction().commit();
          
        session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction(); 
          
        // On va d'abord chercher l'id du message que l'on viens d'ajouter
        query = session.createSQLQuery("SELECT ID_MESSAGE_INTERNE "
                  + "FROM MESSAGE_INTERNE WHERE ID_ENVOYEUR = :idEnvoyeur "
                  + "AND DATE_ENVOI = :dateEnvoi ");

        query.setParameter("idEnvoyeur", message.getEnvoyeur().getIdCompte());
        query.setParameter("dateEnvoi", maintenant);
        List temp = query.list();
        idMessage = (Integer)temp.get(0);
          
        // On ajoute les liens entre le compte et le message
        for(Integer dest:destinataires){
            query = session.createSQLQuery("INSERT into COMPTE_MESSAGE_INTERNE"
                    + "(FK_ID_COMPTE, FK_ID_MESSAGE_INTERNE, date_envoi) "
                    + "values(:idCompte, :idMessage, :dateEnvoi)");
            query.setParameter("idCompte", dest);
            query.setParameter("idMessage", idMessage);
            query.setParameter("dateEnvoi", maintenant);
            query.executeUpdate();
        }
          
        //on commit le tout dans la base de données
        session.getTransaction().commit();
    }
    
    /**
     * Fonction qui va chercher le caractère dans la colonne MESSAGE_LU de la
     * table COMPTE_MESSAGE_INTERNE selon l'id du compte et l'id du message.
     * @param idMessage
     * @param idCompte
     * @return 
     */
    public char chercherSiMessageLu(Integer idMessage, Integer idCompte){
        char messageLu = 'N';
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        Query query = session.createSQLQuery("SELECT MESSAGE_LU FROM "
                 + "COMPTE_MESSAGE_INTERNE WHERE FK_ID_COMPTE = :idCompte "
                 + "AND FK_ID_MESSAGE_INTERNE = :idMessage");
        query.setParameter("idCompte", idCompte);
        query.setParameter("idMessage", idMessage);
        List donneesCompte = query.list();
        String temp = (String)donneesCompte.get(0);
        messageLu = temp.charAt(0);
        return messageLu;
    }
    
    /**
     * Procédure qui va supprimer, dans la base de données, le lien entre la 
     * table compte et message pour le message et le compte dont les id sont 
     * passés en paramètre. S'il n'y a plus de liens vers le message, on le
     * supprime lui aussi.
     * @param idMessage
     * @param idCompte 
     */
    public void supprimerMessageInterne(Integer idMessage, Integer idCompte){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        Query query = session.createSQLQuery("DELETE FROM "
                 + "COMPTE_MESSAGE_INTERNE WHERE FK_ID_COMPTE = :idCompte "
                 + "AND FK_ID_MESSAGE_INTERNE = :idMessage");
        query.setParameter("idCompte", idCompte);
        query.setParameter("idMessage", idMessage);
        query.executeUpdate();
        
        
        // On tente de trouver tous les liens vers le message
        query = session.createSQLQuery("SELECT * FROM COMPTE_MESSAGE_INTERNE "
                + "WHERE FK_ID_MESSAGE_INTERNE = :idMessage");
        query.setParameter("idMessage", idMessage);
        List temp = query.list();
        
        // S'il n'y en a pas, on supprime le message
        if(temp.isEmpty()){
            query = session.createSQLQuery("delete from MESSAGE_INTERNE "
                    + "where ID_MESSAGE_INTERNE = :idMessage");
            query.setParameter("idMessage", idMessage);
            query.executeUpdate();
        }
        session.getTransaction().commit();
    }
    
    /**
     * Procédure servant à indiquer dans la base de données qu'un mesasge 
     * interne relié à un copte à été lu.
     * @param idCompte
     * @param idMessage 
     */
    public void lireMessageInterne(Integer idCompte, Integer idMessage){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();  
        
        Query query = session.createSQLQuery("UPDATE COMPTE_MESSAGE_INTERNE SET"
                + " message_lu = 'O' WHERE FK_ID_COMPTE = :idCompte AND"
                + " FK_ID_MESSAGE_INTERNE = :idMessage");

        query.setParameter("idCompte", idCompte);
        query.setParameter("idMessage", idMessage);
        query.executeUpdate();
        session.getTransaction().commit();
    }
}
